/*
 * Copyright 2002-2014 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.context;

import org.springframework.beans.factory.HierarchicalBeanFactory;
import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.core.env.EnvironmentCapable;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.lang.Nullable;

/**
 *
 * 为应用程序提供配置的中央接口。这在应用程序运行时是只读的，但如果实现支持他可能会重新加载。
 * 意思就是说：spring一旦容器启动了，大部分的配置都默认不会变化了，但是如果你想定制，在运行时改变，
 * 其实也是可以做到的。
 *
 * <p>应用程序上下文提供：
 * <ul>
 * <li>访问应用程序组件的Bean工厂方法
 * 继承自ListableBeanFactory接口
 * <li>以通用方式加载资源文件的能力
 * 继承自ResourceLoader接口
 * <li>向注册的监听器发布事件的能力。
 * 继承自ApplicationEventPublisher接口
 * <li>解析消息的能力，支持国际化。
 * 继承自MessageSource接口
 * <li>继承了父容器。子容器中的定义更优先。例如：这意味着单个父容器可以被整个web应用程序使用，而每个servlet都有自己的上下文，
 * </ul>
 *
 * <p>In addition to standard {@link org.springframework.beans.factory.BeanFactory}
 * lifecycle capabilities, ApplicationContext implementations detect and invoke
 * {@link ApplicationContextAware} beans as well as {@link ResourceLoaderAware},
 * {@link ApplicationEventPublisherAware} and {@link MessageSourceAware} beans.
 *
 * @author Rod Johnson
 * @author Juergen Hoeller
 * @see ConfigurableApplicationContext
 * @see org.springframework.beans.factory.BeanFactory
 * @see org.springframework.core.io.ResourceLoader
 */
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
		MessageSource, ApplicationEventPublisher, ResourcePatternResolver {

	/**
	 * 返回此应用程序上下文的唯一ID。
	 */
	@Nullable
	String getId();

	/**
	 * 返回此上下文所属的已发布应用程序的名称。
	 * 就是你最终用了哪个容器 ，把这个类名给你返回回去
	 */
	String getApplicationName();

	/**
	 *
	 * 相当于返回一个容器上下文的别名
	 */
	String getDisplayName();

	/*返回容器加载的时间*/
	long getStartupDate();

	/**
	 *
	 * 返回父上下文，如果没有父上下文并且这是上下文层次结构的根，则返回null 。
	 *
	 */
	@Nullable
	ApplicationContext getParent();

	/**
	 * 为此上下文公开 AutowireCapableBeanFactory 功能。
	 * 这通常不被应用程序代码使用，除非用于初始化位于应用程序上下文之外的 bean 实例，将 Spring bean 生命周期（全部或部分）应用于它们。
	 * 或者，由ConfigurableApplicationContext接口公开的内部 BeanFactory 也提供对AutowireCapableBeanFactory接口的访问。
	 * 本方法主要用作 ApplicationContext 接口上的一个方便的、特定的工具。
	 * 注意：从 4.2 开始，此方法将在应用程序上下文关闭后始终抛出 IllegalStateException。
	 * 在当前的 Spring Framework 版本中，只有可刷新的应用程序上下文才会这样做； 从 4.2 开始，所有应用程序上下文实现都需要遵守。
	 */
	AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;

}
